// 将状态定义为常量，方便复用
const PENDING = 'pending' // 等待
const FULFILLED = 'fulfilled' // 成功
const REJECTED = 'rejected' // 失败

class MyPromise {
  // 在执行 MyPromise 时，需要传递一个执行器，因此可使用构造函数来接收执行器
  // executor：执行器（立即执行）
  constructor(executor) {
    executor(this.resolve, this.reject)
  }
  // resolve & reject 是用来更改状态的，因此我们需提前声明状态
  // 且状态是每个 Promise 对象独有的，将其定义为实例属性，默认值为pending
  status = PENDING

	// 声明成功后的值以及失败后的原因
	value = undefined
	reason = undefined
  
  // 添加 resolve 属性
  resolve = value => {
    // 防止更改状态，需提前判断
    if (this.status !== PENDING) return
    // 将状态更改为成功
    this.status = FULFILLED
    
    // 保存成功后的值
    this.value = value
  }
  // 添加 reject 属性
  reject = reason => {
    // 防止更改状态，需提前判断
    if (this.status !== PENDING) return
    // 将状态更改为失败
    this.status = REJECTED
    
    // 保存失败后的原因
    this.reason = reason
  }
  // 接收成功的回调 & 失败的回调
  then(successCallback, failCallback) {
    // 判断状态
    if (this.status === FULFILLED) {
      successCallback(this.value)
    } else if (this.status === REJECTED) {
      failCallback(this.reason)
    }
  }
}
module.exports = MyPromise // 将此类导出